#include<stdio.h>
#include<sys/mman.h>
#include<sys/types.h>
#include<fcntl.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
#include<linux/fb.h>
#include<sys/ioctl.h>

int main(int argc, char const *argv[])
{
    int lcd = open("/dev/fb0", O_RDWR);
    if (lcd == -1)
    {
        perror("open");
        return 0;
    }

    struct fb_var_screeninfo vinfo;
    struct fb_fix_screeninfo finfo;
    ioctl(lcd, FBIOGET_FSCREENINFO, &finfo);
    ioctl(lcd, FBIOGET_VSCREENINFO, &vinfo);

    int lcd_w = vinfo.xres;
    int lcd_h = vinfo.yres;
    int bpp   = vinfo.bits_per_pixel;//色深
    // 映射
    char *addr = mmap(NULL, lcd_w*lcd_h*bpp/8, PROT_READ|PROT_WRITE, MAP_SHARED, lcd, 0);
    if (addr == MAP_FAILED)
    {
        perror("mmap");
        return 0;
    }

    int write = 0x00FFFFFF;//白色
    int red = 0x00FF0000;//红色
    int green = 0x0000FF00;//绿色
    int blue = 0x000000FF;//蓝色
    while(1){
        for(int i = 0; i < 480; i++){
            if(0 <= i && i < 160){
                for(int j = 0; j < 800; j++)
                    memcpy(addr + i*800*4 + j*4, &red, 4);
            }else if(160 <= i && i < 320){
                for(int j = 0; j < 800; j++)
                    memcpy(addr + i*800*4 + j*4, &write, 4);
            }else if(320 <= i && i < 480){
                for(int j = 0; j < 800; j++)
                    memcpy(addr + i*800*4 + j*4, &blue, 4);
            }
        }
        sleep(1);// 睡眠1秒

        for(int i = 0; i < 480; i++){
            if(0 <= i && i < 160){
                for(int j = 0; j < 800; j++)
                    memcpy(addr + i*800*4 + j*4, &blue, 4);
            }else if(160 <= i && i < 320){
                for(int j = 0; j < 800; j++)
                    memcpy(addr + i*800*4 + j*4, &red, 4);
            }else if(320 <= i && i < 480){
                for(int j = 0; j < 800; j++)
                    memcpy(addr + i*800*4 + j*4, &write, 4);
            }
        }
        sleep(1);// 睡眠1秒

        for(int i = 0; i < 480; i++){
            if(0 <= i && i < 160){
                for(int j = 0; j < 800; j++)
                    memcpy(addr + i*800*4 + j*4, &write, 4);
            }else if(160 <= i && i < 320){
                for(int j = 0; j < 800; j++)
                    memcpy(addr + i*800*4 + j*4, &blue, 4);
            }else if(320 <= i && i < 480){
                for(int j = 0; j < 800; j++)
                    memcpy(addr + i*800*4 + j*4, &red, 4);
            }
        }
        sleep(1);// 睡眠1秒
    }
}
